# language: zh-CN
# 需求ID: REQ-001
# SRS需求: 3.1 DSL解析与领域图
# Feature ID: Epic 1.1
# 用户故事: US-001, US-002, US-003
功能: DSL 语言设计
  作为领域专家
  我希望能用简洁的YAML DSL语法定义实体和属性
  以便快速描述业务模型而无需学习复杂的编程语法

  背景:
    假设我是一个领域专家
    并且我需要定义业务模型
    并且我不熟悉复杂的编程语法
    并且我使用YAML格式的DSL v2.0.0规范

  # US-001: 作为领域专家，我希望能用简洁的DSL语法定义实体和属性
  场景: 使用YAML DSL v2.0语法定义实体和属性
    假设我有一个用户实体需要定义
    假设我使用YAML DSL语法从文件加载以下内容:
      """
      tests/cucumber/fixtures/entities/user-dsl.yml
      """
    那么系统应该成功解析实体定义
    并且应该识别出10个属性（包括新增的status字段）
    并且应该正确识别主键为id
    并且应该正确识别必填字段为email、name和password
    并且应该正确识别唯一字段为email
    并且应该正确识别验证规则
    并且应该识别类型别名定义（Timestamp、UserStatus、Email）
    并且应该识别参数化模板引用（configurable_string、secure_password）

  # US-002: 作为领域专家，我希望能在DSL中声明实体间的关联关系
  场景: 定义实体间的关联关系
    假设我需要定义用户和订单的关系
    假设我使用YAML DSL语法从文件加载以下内容:
      """
      tests/cucumber/fixtures/entities/user-dsl.yml
      """
    那么系统应该成功解析关联关系
    并且应该识别出User到Order的一对多关系
    并且应该识别出关系映射字段为user
    并且应该自动推断外键关系
    并且应该支持关联关系的描述信息

  # US-003: 作为领域专家，我希望能在DSL中定义业务行为（命令/事件）
  场景: 定义业务行为（命令/事件）
    假设我需要定义用户注册的业务流程
    假设我使用YAML DSL语法从文件加载以下内容:
      """
      tests/cucumber/fixtures/entities/user-dsl.yml
      """
    那么系统应该成功解析命令定义
    并且应该识别出RegisterUser命令
    并且应该识别出结构化的输入参数定义
    并且应该识别出输出参数定义
    并且应该识别出UserRegistered事件
    并且应该识别出事件的结构化属性定义
    并且应该建立命令与事件的关联

  场景: 验证跨字段验证功能
    假设我定义了跨字段验证规则
    假设我使用YAML DSL语法从文件加载以下内容:
      """
      tests/cucumber/fixtures/entities/user-dsl.yml
      """
    那么系统应该成功解析跨字段验证定义
    并且应该识别出age_email_consistency验证规则
    并且应该正确解析验证条件和错误消息

  场景大纲: 验证DSL v2.0语法错误处理
    假设我编写了包含语法错误的YAML DSL
    当我使用错误的YAML语法: "<错误语法>"
    那么系统应该返回语法错误
    并且应该提供有意义的错误信息
    并且应该指出错误位置

    例子:
      | 错误语法 |
      | domain: User\nentities:\n  User:\n    attributes:\n      id:\n        type: unknown_type |
      | domain: User\ntype_aliases:\n  InvalidAlias: invalid_structure |
      | domain:\nentities: missing_domain_name |
      | invalid_yaml: [ unclosed_bracket |

  @skip
  场景: 支持DSL语法验证和错误提示
    假设我在编写YAML DSL时出现错误
    当我输入不完整或错误的YAML结构
    那么系统应该提供清晰的错误信息
    并且应该指出具体的错误位置
    并且应该提供修复建议
    并且应该验证字段类型的有效性
    并且应该验证类型别名的正确性
    并且应该验证参数化模板的引用